package com.cctc.aop;

import com.cctc.entity.PurchaseEntity;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

/**
 * @Name CommonPointCuts
 * @Description: 命名切点
 * 使用 [命名切点] 可以显著提高代码的可读性。
 * @Author: lichao
 * @Email: li2chao@126.com
 * @Date: 2024-01-18 19:14:25
 **/
@Aspect
public class CommonPointCuts {

    /**
     * 种类指定器：子 service 包中定义的任何方法的 execution
     * @author lichao
     * @email li2chao@126.com
     * @date 2024/01/18 19:24:51
     */
    @Pointcut("execution(* com.cctc..service.*.*(..)) && args(purchase,..) ")
    public void inServiceLayerAllMethod(PurchaseEntity purchase) {}

    /**
     * 种类指定器：可审计的子 service 包中定义的任何方法的 execution
     * @author lichao
     * @email li2chao@126.com
     * @date 2024/01/18 21:04:35
     */
    @Pointcut("execution(* com.cctc..service.auditable.*.*(..))")
    public void inAuditableServiceMethod() {}

    /**
     * 范围指定器：dao 包或其一个子包范围（仅在 Spring AOP 中的 method execution）
     * @author lichao
     * @email li2chao@126.com
     * @date 2024/01/18 19:26:21
     */
    @Pointcut("within(com.cctc.dao..*)")
    public void inDaoLayerAllMethod() {}

    /**
     * 上下文指定器：任何实现了 PurchaseService 接口的 AOP 代理本身（仅在 Spring AOP 中的 method execution）
     * @author lichao
     * @email li2chao@126.com
     * @date 2024/01/18 19:27:43
     */
    @Pointcut("this(com.cctc.service.PurchaseService)")
    public void inAopSelfAllMethod() {}

    /**
     * 上下文指定器：任何带 @Transactional 注解的目标对象（仅在 Spring AOP 中的 method execution）
     * @author lichao
     * @email li2chao@126.com
     * @date 2024/01/18 19:32:46
     */
    @Pointcut("target(org.springframework.transaction.annotation.Transactional)")
    public void inTargetObject() {}

    /**
     * 上下文指定器：名称为 *Service 的 Spring Bean 实例（仅在Spring AOP中的method execution）
     * @author lichao
     * @email li2chao@126.com
     * @date 2024/01/18 19:39:31
     */
    @Pointcut("bean(*Service)")
    public void inTargetBean() {}

    /**
     * 上下文指定器：任何带 @Transactional 注解的目标方法（仅在 Spring AOP 中的 method execution）
     * @author lichao
     * @email li2chao@126.com
     * @date 2024/01/18 19:35:46
     */
    @Pointcut("@annotation(org.springframework.transaction.annotation.Transactional)")
    public void inTargetMethod() {}

    /**
     * 上下文指定器：任何带 @Qualifier 注解的目标参数（仅在 Spring AOP 中的 method execution）
     * @author lichao
     * @email li2chao@126.com
     * @date 2024/01/18 19:36:48
     */
    @Pointcut("args(jakarta.inject.Qualifier)")
    public void inTargetArgs() {}

}

